package ar.pegasus.webcam.boss;



/**
 * Esta clase se usa para recuperar algunos parametros de configuración 
 * que dependerán de que parte se ejecute en un servidor (Consulta Web) o en una 
 * maquina local (Automata,Desktop).
 * 
 * @author oarias
 */
public class BossConfiguracionApp {

	private static BossConfiguracionApp instance = null;

	public static final String JPEG = "JPEG";
	public static final String PNG = "PNG";

	
	public static  BossConfiguracionApp getInstance(){
		if(instance == null)
			instance = new BossConfiguracionApp();
		return instance;
	}
	
	private String applicationName;
	private String NumeroRelease  = "1.4.1";
	private String webCamDir;
	private String pathArchivoIntercambio;
	private String nombreArchivoIntercambio;
	private String nombreArchivoImagen;
	private String formatoImagen;
	private boolean multicaptura;
	private boolean imagenConEpigrafe;
	
	public BossConfiguracionApp(){
		// Asigno valores default a la aplicacion.
		setPathArchivoIntercambio("./");
		setMultiCaptura(false);
		setNombreArchivoIntercambio("captura.xml");
		setNombreArchivoImagen("imagenCapturada.jpg");
		setFormatoImagen(JPEG);
		
	}

	public void setApplicationName(String applicationName) {
		this.applicationName = applicationName;
	}

	public String getApplicationName() {
		return applicationName;
	}

	public Integer getIntentosPermitidos() {
		return 3;
	}

	public void setNumeroRelease(String numeroRelease) {
		NumeroRelease = numeroRelease;
	}

	public String getNumeroRelease() {
		return NumeroRelease;
	}

	public void setWebCamDir(String webCamDir) {
		this.webCamDir = webCamDir;
	}

	public String getWebCamDir() {
		return webCamDir;
	}

	public void setPathArchivoIntercambio(String pathImagenCapturada) {
		this.pathArchivoIntercambio = pathImagenCapturada;
	}

	/**
	 * Retorna el path donde se ha de guardar el archivo de intercambio de la aplicacion.
	 * @return
	 */
	public String getPathArchivoIntercambio() {
		return pathArchivoIntercambio;
	}

	public void setNombreArchivoIntercambio(String nombreImagenCapturada) {
		this.nombreArchivoIntercambio = nombreImagenCapturada;
	}
	
	/**
	 * Retorna el nombre del archivo de Intercambio
	 * @return
	 */
	public String getNombreArchivoIntercambio(){
		return this.nombreArchivoIntercambio;
	}

	/**
	 * Determina si debe hacer mas de una captura o solo guardar la 
	 * ultima imagen capturada.
	 * @param multicaptura
	 */
	public void setMultiCaptura(boolean multicaptura) {
		this.multicaptura = multicaptura;
	}
	
	public boolean isMulticaptura(){
		return this.multicaptura;
	}
	
	public boolean isCapturaSimple(){
		return !this.multicaptura;
	}

	/**
	 * Retorna el path completo donde se almacena el Archivo de Intercambio 
	 * en formato XML.
	 * 
	 * @return Path completo
	 */
	public String getFullPathArchivoIntercambio() {
		StringBuilder sb = new StringBuilder(getPathArchivoIntercambio());
		if(!getPathArchivoIntercambio().endsWith("/"))
			sb.append("/");
		sb.append(getNombreArchivoIntercambio());
		if(!getNombreArchivoIntercambio().toUpperCase().endsWith(".XML"))
			sb.append(".XML");
		return sb.toString();
	}

	public void setNombreArchivoImagen(String nombreArchivoImagen) {
		this.nombreArchivoImagen = nombreArchivoImagen;
	}
	
	public String getNombreArchivoImagen(){
		return this.nombreArchivoImagen;
	}

	public void procesarArgumentos(String[] args) throws Exception {
		int pos = 0;
		while(pos < args.length){
			String arg = args[pos].toLowerCase();
			String cmd = "";
			String value = "";
			// Si el argumento comienza con - entonces es un comando.
			if(arg.startsWith("-")){
				cmd = arg.substring(1);
				arg = args[++pos];
				if(arg.startsWith("-"))
					throw new Exception("Debe definir el valor para el comando -" + cmd);
				// si no es comando, es el valor del comando.
				value = arg;
			} else {
				throw new Exception("No se pudo identificar a que comando se refiere el valor '" + cmd + "'");
			}
			asignarValor(cmd,value);
			pos++;			
		}
	}

	private void asignarValor(String cmd, String value) {
		if(cmd.equals("p")){
			setPathArchivoIntercambio(value);
			return;
		}
		if(cmd.equals("nm")){
			BossConfiguracionApp.getInstance().setNombreArchivoIntercambio(value);
			return;
		}
		if(cmd.equals("img")){
			BossConfiguracionApp.getInstance().setNombreArchivoImagen(value);
			return;
		}
		if(cmd.equals("f")){
			value = value.toUpperCase();
			if(!value.equals(JPEG) && !value.equals(PNG)) return;
			BossConfiguracionApp.getInstance().setFormatoImagen(JPEG);
			return;
		}

		if(cmd.equals("multicapture")){
			boolean mc = value.equals("yes") || value.equals("y")|| value.equals("s") || value.equals("s");    
			BossConfiguracionApp.getInstance().setMultiCaptura(mc);	
		}			

		if(cmd.equals("cm")){
			boolean mc = value.equals("yes") || value.equals("y")|| value.equals("s") || value.equals("s");    
			BossConfiguracionApp.getInstance().setImagenConEpigrafe(mc);	
		}			
		
	}

	private void setImagenConEpigrafe(boolean imagenConEpigrafe) {
		this.imagenConEpigrafe = imagenConEpigrafe;
	}

	public boolean isImagenConEpigrafe() {
		return imagenConEpigrafe;
	}

	public void setFormatoImagen(String formatoImagen) {
		this.formatoImagen = formatoImagen;
	}

	public String getFormatoImagen() {
		return formatoImagen;
	}
}
